package com.itdianzi.controller.shiro;

import com.itdianzi.domain.system.User;
import com.itdianzi.export_common.common.utils.Encrypt;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;

public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {
    /**
     * 密码比较的方法
     * 方法名称: 执行密码匹配
     * 参数:
     *  @param token 页面传入的用户名和密码 UsernamePasswordToken  用户页面输入的密码
     *  @param info  在认证方法中构建 用户数据库的数据(安全数据)   数据库中查询的密码
     * @return 返回true 表示密码比较成功 返回false密码比较失败(直接抛出异常)
     * MD5Hash 密码特殊加密 将明文的数据 加密成密文的数据 , 不可逆算法
     * 111 ->> xxx
     * 222 ->> yyy
     * 强大的数据库
     *
     * 为了防止这种查询解密 我们在用户的密码之后 补充数据
     * 在人家的数据基础之上 , 我们再次补充内容 修改其原有数据 加盐 ,加密加盐算法
     * 111 + 123 ->> tttttt
     * 222 + 123 ->> uuuuuu
     * 不建议使用固定字符串当盐 , 使用可变化的盐(针对于不同的数据而言),
     *  但是针对于每一条数据而言 这个盐是固定的 , 用户id , 用户邮箱（只要针对某一条数据 这个盐是固定的即可） 取几位即可
     * 123 + zhangsan
     * 222 + lisi
     *
     * 截取字符串当作盐 +  1234
     */
    @Override
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {

        //1.用户页面输入的账号密码
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String email = upToken.getUsername();
        String password = new String(upToken.getPassword());

        //2.数据库中查询的密码
        //构建安全数据的时候，需要传入第二个参数
        String dbpassword = (String) info.getCredentials();

        //截取用户名前几个数
        /*email.substring(0, 2);*/

        //先对用户的密码进行加盐加密
        String md5wd = Encrypt.md5(password, email);


        return md5wd.equals(dbpassword);
    }

}
